package com.kth.baasio.preferences;
import com.kth.baasio.exception.BaasioError;
import com.kth.baasio.utils.JsonUtils;
import com.kth.baasio.utils.ObjectUtils;
import com.kth.common.PlatformSpecificImplementationFactory;
import com.kth.common.preference.SharedPreferenceSaver;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;
import java.util.UUID;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
public class BaasioPreferences {
private static final String DEFAULT_PREFERENCES_NAME = "BaasioPreferences";
private static final String SHARED_PREFERENCE_NAME_SECRET_UUID = "baasio_user_secret";
private static final String SHARED_PREFERENCE_NAME_USER_STRING = "baasio_user_data";
private static final String SHARED_PREFERENCE_NAME_ACCESS_TOKEN = "baasio_access_token";
private static final String SHARED_PREFERENCE_NAME_REGISTERED_SENDER_ID_FOR_PUSH = "baasio_registered_sender_id";
private static final String SHARED_PREFERENCE_NAME_REGISTERED_DEVICE_UUID_FOR_PUSH = "baasio_registered_device_uuid_for_push";
private static final String SHARED_PREFERENCE_NAME_REGISTERED_USERNAME_FOR_PUSH = "baasio_registered_username_for_push";
private static final String SHARED_PREFERENCE_NAME_REGISTERED_TAGS_FOR_PUSH = "baasio_registered_tag_for_push";
private static final String SHARED_PREFERENCE_NAME_REGISTERED_REGID_FOR_PUSH = "baasio_registered_regid_for_push";
private static final String SHARED_PREFERENCE_NAME_NEED_REGISTER_TAGS_FOR_PUSH = "baasio_need_register_tag_for_push";
private static SharedPreferences mPreferences;
private static SharedPreferences getPreference(Context context) {
if (mPreferences == null)
mPreferences = context.getSharedPreferences(DEFAULT_PREFERENCES_NAME,
Context.MODE_PRIVATE);
return mPreferences;
}
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException(BaasioError.ERROR_NOT_SUPPORT_CLONING);
}
public static void clear(Context context) {
SharedPreferences.Editor editor = getPreference(context).edit();
editor.clear();
SharedPreferenceSaver saver = PlatformSpecificImplementationFactory
.getSharedPreferenceSaver(context);
saver.savePreferences(editor, false);
}
public static void setUserString(Context context, String string) {
String secret = UUID.randomUUID().toString();
SharedPreferences.Editor editor = getPreference(context).edit();
editor.putString(SHARED_PREFERENCE_NAME_SECRET_UUID, secret);
editor.putString(SHARED_PREFERENCE_NAME_USER_STRING, encrypt(context, secret, string));
SharedPreferenceSaver saver = PlatformSpecificImplementationFactory
.getSharedPreferenceSaver(context);
saver.savePreferences(editor, false);
}
public static String getUserString(Context context) {
SharedPreferences prefs = getPreference(context);
String secret = prefs.getString(SHARED_PREFERENCE_NAME_SECRET_UUID, "");
if (ObjectUtils.isEmpty(secret)) {
return "";
}
String result = prefs.getString(SHARED_PREFERENCE_NAME_USER_STRING, "");
if (result.length() <= 0) {
return result;
}
return decrypt(context, secret, result);
}
public static void setAccessToken(Context context, String string) {
SharedPreferences.Editor editor = getPreference(context).edit();
editor.putString(SHARED_PREFERENCE_NAME_ACCESS_TOKEN, string);
SharedPreferenceSaver saver = PlatformSpecificImplementationFactory
.getSharedPreferenceSaver(context);
saver.savePreferences(editor, false);
}
public static String getAccessToken(Context context) {
SharedPreferences prefs = getPreference(context);
String result = prefs.getString(SHARED_PREFERENCE_NAME_ACCESS_TOKEN, "");
return result;
}
public static void setDeviceUuidForPush(Context context, String string) {
SharedPreferences.Editor editor = getPreference(context).edit();
editor.putString(SHARED_PREFERENCE_NAME_REGISTERED_DEVICE_UUID_FOR_PUSH, string);
SharedPreferenceSaver saver = PlatformSpecificImplementationFactory
.getSharedPreferenceSaver(context);
saver.savePreferences(editor, false);
}
public static String getDeviceUuidForPush(Context context) {
SharedPreferences prefs = getPreference(context);
String result = prefs.getString(SHARED_PREFERENCE_NAME_REGISTERED_DEVICE_UUID_FOR_PUSH, "");
return result;
}
public static void setRegisteredSenderId(Context context, String[] string) {
SharedPreferences.Editor editor = getPreference(context).edit();
if (!ObjectUtils.isEmpty(string)) {
String result = JsonUtils.toJsonString(string);
editor.putString(SHARED_PREFERENCE_NAME_REGISTERED_SENDER_ID_FOR_PUSH, result);
} else {
editor.putString(SHARED_PREFERENCE_NAME_REGISTERED_SENDER_ID_FOR_PUSH, "");
}
SharedPreferenceSaver saver = PlatformSpecificImplementationFactory
.getSharedPreferenceSaver(context);
saver.savePreferences(editor, false);
}
public static String[] getRegisteredSenderId(Context context) {
SharedPreferences prefs = getPreference(context);
String resultString = prefs.getString(SHARED_PREFERENCE_NAME_REGISTERED_SENDER_ID_FOR_PUSH,
"");
if (!ObjectUtils.isEmpty(resultString)) {
String[] result = JsonUtils.fromJsonString(resultString, String[].class);
return result;
}
return null;
}
public static void setRegisteredUserName(Context context, String string) {
SharedPreferences.Editor editor = getPreference(context).edit();
editor.putString(SHARED_PREFERENCE_NAME_REGISTERED_USERNAME_FOR_PUSH, string);
SharedPreferenceSaver saver = PlatformSpecificImplementationFactory
.getSharedPreferenceSaver(context);
saver.savePreferences(editor, false);
}
public static String getRegisteredUserName(Context context) {
SharedPreferences prefs = getPreference(context);
String result = prefs.getString(SHARED_PREFERENCE_NAME_REGISTERED_USERNAME_FOR_PUSH, "");
return result;
}
public static void setRegisteredTags(Context context, String string) {
SharedPreferences.Editor editor = getPreference(context).edit();
editor.putString(SHARED_PREFERENCE_NAME_REGISTERED_TAGS_FOR_PUSH, string);
SharedPreferenceSaver saver = PlatformSpecificImplementationFactory
.getSharedPreferenceSaver(context);
saver.savePreferences(editor, false);
}
public static String getRegisteredTags(Context context) {
SharedPreferences prefs = getPreference(context);
String result = prefs.getString(SHARED_PREFERENCE_NAME_REGISTERED_TAGS_FOR_PUSH, "");
return result;
}
public static void setRegisteredRegId(Context context, String string) {
SharedPreferences.Editor editor = getPreference(context).edit();
editor.putString(SHARED_PREFERENCE_NAME_REGISTERED_REGID_FOR_PUSH, string);
SharedPreferenceSaver saver = PlatformSpecificImplementationFactory
.getSharedPreferenceSaver(context);
saver.savePreferences(editor, false);
}
public static String getRegisteredRegId(Context context) {
SharedPreferences prefs = getPreference(context);
String result = prefs.getString(SHARED_PREFERENCE_NAME_REGISTERED_REGID_FOR_PUSH, "");
return result;
}
public static void setNeedRegisteredTags(Context context, String string) {
SharedPreferences.Editor editor = getPreference(context).edit();
editor.putString(SHARED_PREFERENCE_NAME_NEED_REGISTER_TAGS_FOR_PUSH, string);
SharedPreferenceSaver saver = PlatformSpecificImplementationFactory
.getSharedPreferenceSaver(context);
saver.savePreferences(editor, false);
}
public static String getNeedRegisteredTags(Context context) {
SharedPreferences prefs = getPreference(context);
String result = prefs.getString(SHARED_PREFERENCE_NAME_NEED_REGISTER_TAGS_FOR_PUSH, "");
return result;
}
private static final char[] SEKRIT = new String("baasio_eoqkrqktm!@").toCharArray();
protected static String encrypt(Context context, String uuid, String value) {
try {
final byte[] bytes = value != null ? value.getBytes("UTF-8") : new byte[0];
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(uuid.getBytes("UTF-8"),
20));
return new String(Base64.encode(pbeCipher.doFinal(bytes), Base64.NO_WRAP), "UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
protected static String decrypt(Context context, String uuid, String value) {
try {
final byte[] bytes = value != null ? Base64.decode(value, Base64.DEFAULT) : new byte[0];
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(uuid.getBytes("UTF-8"),
20));
return new String(pbeCipher.doFinal(bytes), "UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}